package com.ftg.learn.back;

import com.ftg.learn.back.exception.MyException;

import javax.xml.soap.Node;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 通讯录主体类，包含大量的操作
 * @author kangjx
 * @createTime 2022/8/29
 */
public class NotesList {

    private List<Note> notes = new ArrayList<>();

    /**
     * 用来添加数据
     * @param e
     * @return
     */
    public boolean add(Note e){
        return notes.add(e);
    }

    /**
     * 修改操作  按照名称进行修改
     * @param e
     * @return
     */
    public boolean update(Note e){
        for (int i = 0; i < notes.size(); i++) {
            Note temp = notes.get(i);
            if(temp.getName().equals(e.getName())){
                return this.notes.set(i,e) != null ? true : false;
            }
        }
        return false;
    }

    /**
     * 需求变更，在第一题的基础上对通讯者姓名相同的手机号进行合并，如：{张
     * 三,13634833333}{张三,15176413125}则合并成{张三,[13634833333,15176413125]}。
     *
     * 甲方 ：  返回新的list<map></map>
     *         原有基础上改
     *         distinct 今天 要写的操作
     *         [{name:张三,telphone:123,456,789}]
     *
     *
     *         Note n = new Note("张三","13634833333");
     *         list.add(n);
     *
     *         n = new Note("张三","15176413125");
     *         list.add(n);
     *
     *         n = new Note("李四","15176413125");
     *
     * @return
     */
    public List<Note> merge(){

        //是不是一个全新的地址
        List<Note> newlist = new ArrayList<>();
        for (int i = 0,len = this.notes.size(); i < len; i++) {
            //是全新的地址的吗    notes.get(i) --- > temp 就是note里面的那个元本身
            //第一个方案  ： new temp()原始的值给过来;
//            Note  no1 = new Note(notes.get(i).getName(),notes.get(i).getTelphone());
            //第二个方案   : clone();
            Note temp = notes.get(i).clone();
            String name = temp.getName();
            int index = this.findNoteByName(newlist,name);

            if(index < 0 ) {
//                首次添加这个人的电话 号码
                newlist.add(temp);
            }else{
//                合并电话号码  15176413125
                String oldPersonTel = newlist.get(index).getTelphone();
                //temp 电话号码 15176413125,13634833333
                temp.setTelphone(temp.getTelphone() + "," + oldPersonTel);
                newlist.set(index,temp);
            }
        }
        return newlist;
    }

    /**
     * 通过名称查询当前用户 是否有电话信息
     * @param name
     * @return
     */
    public int findNoteByName( List<Note> list, String name){
        for (int i = 0,len = list.size(); i < len; i++) {
            if (this.notes.get(i).getName().equals(name)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 为了第二题转换一个存储结构
     * @return
     */
    public List<NoteMerge> mergeShow(){
        //把电话 号码合并成一个字符串格式
        List<Note> newlist = this.merge();
        List<NoteMerge> merges = new ArrayList<>();
        for (int i = 0; i < newlist.size(); i++) {
            Note n1 = newlist.get(i);
            //做字符串转换成为字符串数组操作
            NoteMerge merge = new NoteMerge(n1.getName(),n1.getTelphone().split(","));
//            [{name=张三,telphone:[123,456,789]}]
            merges.add(merge);
        }
        return merges;
    }

    /**
     * 删除元素
     * @param name
     * @return
     */
    public boolean remove(String name){
        for (int i = 0; i < this.notes.size(); i++) {
            String n = this.notes.get(i).getName();
            if(name.equals(n)){
                return this.notes.remove(i) != null ? true : false;
            }
        }
        return false;
    }

    /**
     * 添加一个需求用来处理自定义异常
     * @param name
     * @return
     */
    public boolean removeByException(String name) {
        int index = this.findNoteByName(this.notes,name);
        if(index == -1){
            throw new MyException("当前的用户"+ name +"不存在!!!");
        }
        return this.notes.remove(index) == null ? false : true;
//        return this.remove(name);
    }




    public static void main(String[] args) {
        NotesList list = new NotesList();
        Note n = new Note("张三","13634833333");
        list.add(n);

        n = new Note("张三","15176413125");
        list.add(n);

        n = new Note("李四","15176413125");
        list.add(n);

        List<Note> listnote = list.merge();

        System.out.println(listnote);

        List<Note> listnote1 = list.merge();

        System.out.println(listnote1);

        System.out.println(listnote == listnote1);

        List<NoteMerge> noteMergeList = list.mergeShow();
        System.out.println(noteMergeList);

        List<NoteMerge> noteMergeList1 = list.mergeShow();
        System.out.println(noteMergeList1);
        String d = "a,b,c,d";
        System.out.println(Arrays.toString(d.split(",")));
    }

}
